package com.cskaoyan.javase.thread._6pool;

import java.util.concurrent.*;

/**
 * 向线程池提交Callable任务
 * 实现Callable接口,重写call方法,和run方法一样,都表示一个在线程中被执行的任务
 * 区别是
 * call方法有返回值,run方法没有返回值
 *
 * @since 16:04
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo3 {
    public static void main(String[] args) {
        ExecutorService es = Executors.newFixedThreadPool(2);
        Future<String> result = es.submit(new CallableTask());
        try {
            // get方法具有延迟等待的效果,如果子线程迟迟不能给出结果,那么主线程中的get方法会等待子线程执行完毕,得到这个结果
            String str = result.get();
            System.out.println(str);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

class CallableTask implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println("我是callable接口的实现类执行的任务!");
        Thread.sleep(10000);
        return "hell world!";
    }
}
